package mymyoux.io.mserverconnectorClasses
{
	import mymyoux.events.MEventDispatcher;
	import mymyoux.events.MPlaylistEvent;
	import mymyoux.utils.Hash;
	 	 /**
         * MRoomPlaylist dispatche l'event people_in
         * quand un utilisateur se connecte
         * @eventType mymyoux.events.MRoomEvent
         */
        [Event(name="people_in", type="mymyoux.events.MPlaylistEvent")]
        	 /**
         * MRoomPlaylist dispatche l'event people_out
         * quand un utilisateur se déconnecte
         * @eventType mymyoux.events.MRoomEvent
         */
        [Event(name="people_out", type="mymyoux.events.MPlaylistEvent")]
         /**
         * MRoomPlaylist dispatche l'event people_change_infos
         * quand un utilisateur met à jour ses informations
         * @eventType mymyoux.events.MRoomEvent
         */
        [Event(name="people_change_infos", type="mymyoux.events.MPlaylistEvent")]
        	/**
	 * MPlaylist permet la gestion des personnes présentes dans un salon.
	 * @author Mymyoux
	 * @version 2.0
	 */
	public class MRoomPlaylist extends MEventDispatcher
	{
		/**
		 * MPlaylist à partir de laquelle la MRoomPlaylist est crée
		 */
		protected var playlist:MPlaylist;
		/**
		 * Nom de la MRoom associée.
		 */
		protected var name:String;
		/**
		 * Crée un objet de type MRoomPlaylist
		 */
		public function MRoomPlaylist(name:String,playlist:MPlaylist)
		{
			this.name=name;
			this.playlist=playlist;
			this.playlist.addEventListener(name+MPlaylistEvent.PEOPLE_IN,onPeopleIn);
			this.playlist.addEventListener(name+MPlaylistEvent.PEOPLE_OUT,onPeopleOut);
			this.playlist.addEventListener(MPlaylistEvent.PEOPLE_CHANGE_INFO,onPeopleInfo);
		}
		override public function addEventListener(type:String,listener:Function,useCapture:Boolean=false,priority:int=0,useWeakReference:Boolean=false):void{
			super.addEventListener(type,listener,useCapture,priority,useWeakReference);
			if(type==MPlaylistEvent.PEOPLE_IN){
				var list:Array=playlist.getConnecteds(name);
				for(var i:String in list){
					dispatchEvent(new MPlaylistEvent(MPlaylistEvent.PEOPLE_IN,list[i]));
				}
			}
		}
		/**
		 * Servant spécialement à la MRoom associée pour obtenir l'id d'un joueur.
		 *@param people MServerIdentifier correspondant au joueur.
		 *@return L'id du joueur ou 0 si le joueur n'existe pas.
		 */
		public function getId(people:MServerIdentifier):uint{
			return playlist.getId(people,name);
		}
		/**
		 *Servant spécialement à la MRoom associée pour obtenir un joueur grâce à son id.
		 *@param id Id du joueur.
		 *@return Le MServerIdentifier du joueur ou un vide(ie idx=0) s'il n'exite pas.
		 */
		public function getPeople(id:int):MServerIdentifier{
			return playlist.getPeople(id,name);
		}
		/**
		 * Appelé lors de la connexion d'un joueur dans le salon correspondant à la MRoomPlaylist.
		 * @param e Evenement envoyé par la MPlaylist contenant le MServerIdentifier du joueur concerné.
		 */
		protected function onPeopleIn(e:MPlaylistEvent):void{
			dispatchEvent(new MPlaylistEvent(MPlaylistEvent.PEOPLE_IN,e.people,e.bubbles,e.cancelable));
		}
		/**
		 * Appelé lors de la déconnexion d'un joueur dans le salon correspondant à la MRoomPlaylist.
		 * @param e Evenement envoyé par la MPlaylist contenant le MServerIdentifier du joueur concerné.
		 */
		protected function onPeopleOut(e:MPlaylistEvent):void{
			dispatchEvent(new MPlaylistEvent(MPlaylistEvent.PEOPLE_OUT,e.people,e.bubbles,e.cancelable));
		}
		/**
		 * Appelé lors de la mise à jour du profil d'un joueur dans le salon correspondant à la MRoomPlaylist.
		 * @param e Evenement envoyé par la MPlaylist contenant le MServerIdentifier du joueur concerné.
		 */
		protected function onPeopleInfo(e:MPlaylistEvent):void{
			dispatchEvent(new MPlaylistEvent(MPlaylistEvent.PEOPLE_CHANGE_INFO,e.people,e.bubbles,e.cancelable));
		}
		/**
		 * @copy mymyoux.io.MServerConnector#me
		 */
		public function get me():MServerIdentifier{
			return playlist.me;
		}
		public function get filteredPlaylist():MFilteredPlaylist{
			return new MFilteredPlaylist(this);
		}
		public function get snapshot():Hash{
			return new MFilteredPlaylist(this).players.clone();
		}
	}
}